/*
 * @Author: funlee 
 * @Email: i@funlee.cn 
 * @Date: 2017-12-14 18:24:29 
 * @Last Modified time:   2017-12-14 18:24:29 
 * @Description: 扩展运算符 ...
 * 
 */
// 1.含义：将一个数组转为用逗号分隔的参数序列
console.log(...[1,2,3,4]) // 1 2 3 4
console.log(1,[9,6,5,4],5) // 1 9 6 5 4 5

// 2. 主要用于函数调用
function push(arr,...item) {
  arr.push(...items)
}

function add(x,y) {
  return x + y
}
add(...[10,20])

// 3.扩展运算符与正常的函数参数 结合使用
function f(a,b,c,d,e,f) {
  // code
}
const arr = [0,1,2]
f(-1,...arr,2,...[3])

// 4. 扩展运算符后放置表达式
const a = 10
const arr = [
  ...(x > 0 ? ['a'] : []),
  'b'
]

// 5. 扩展运算符后面接空数组，则无影响
[...[],1]

// 6.替代数组的apply方法
function f(a,b,c) {
  console.log(a + b + c) 
}
var arr = [10,20,30]
f.apply(null,arr)
// 改写
f(...arr)

// 6.求取数组最值
var arr = [10,20,30,40]
console.log(Math.max.apply(null,arr))
console.log(Math.max(...arr))

// 7. 将一个数组添加到另一个数组尾部
var arr1 = [10,20]
var arr2 = [30,40]
Array.prototype.push.apply(arr1,arr2)
arr1.push(...arr2)

//-------------------运用------------------------------------------
// 1.复制数组
var arr1 = [10,20]
var arr2 = arr1
arr2[0] = 30
console.log(arr1) // [30,20]

var arr1 = [10,20]
var arr2 = arr1.concat()
arr2[0] = 60
console.log(arr1)

var arr1 = [10, 20]
var arr2 = [...arr1]
arr2[0] = 100
console.log(arr1)

// 2.合并数组
var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];

// ES5的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

// 3. 与解构赋值结合
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

const [first, ...rest] = [];
first // undefined
rest  // []

const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []

// 4.将字符串转换为数组
var arr = [...'hello']
// [ "h", "e", "l", "l", "o" ]
